<template>
  <div v-if="filmInfo" class="background">
    <detail-header >
      <span v-scroll="50"
        class="header-name"
        :class="headerisHidden ? 'hidden-header' : ''"
        >{{ filmInfo.name }}</span
      >
    </detail-header>
    <div
      class="poster"
      :style="{ backgroundImage: `url(${filmInfo.poster})` }"
    ></div>
    <div class="content">
      <span class="name">{{ filmInfo.name }}</span>
      <span class="item">{{ filmInfo.item.name }}</span>
      <div class="grade">
        {{ filmInfo.grade }}<span class="grade-text">分</span>
      </div>
      <div class="film-category">{{ filmInfo.category }}</div>
      <div class="film-premiere-time">
        {{ getPremiereTime(filmInfo.premiereAt) }} 上映
      </div>
      <div class="film-nation-runtime">
        {{ filmInfo.nation }} | {{ filmInfo.runtime }}分钟
      </div>
      <div class="film-synopsis" :class="isHidden ? 'hidden' : ''">
        {{ filmInfo.synopsis }}
      </div>
      <div class="show-synopsis" @click="isHidden = !isHidden">
        <svg
          v-show="isHidden"
          t="1674969803267"
          class="icon"
          viewBox="0 0 1024 1024"
          version="1.1"
          xmlns="http://www.w3.org/2000/svg"
          p-id="6109"
        >
          <path
            d="M185.884 327.55 146.3 367.133 512.021 732.779 877.7 367.133 838.117 327.55 511.997 653.676Z"
            p-id="6110"
          ></path>
        </svg>
        <svg
          v-show="!isHidden"
          t="1674970608116"
          class="icon"
          viewBox="0 0 1024 1024"
          version="1.1"
          xmlns="http://www.w3.org/2000/svg"
          p-id="7025"
        >
          <path
            d="M77.6 606.5l419.9-419.9c8.2-8.2 21.5-8.2 29.7 0l421.1 421.1c16.4 16.4 16.4 43 0 59.3-16.4 16.4-43 16.4-59.3 0L519.8 297.8c-4.1-4.1-10.7-4.1-14.8 0l-368 368c-16.4 16.4-43 16.4-59.3 0-16.5-16.3-16.5-42.9-0.1-59.3z"
            fill="#2C2C2C"
            p-id="7026"
          ></path>
        </svg>
      </div>
    </div>
    <div class="actors">
      <div class="actors-text">演职人员</div>
      <detail-swiper :interval="12" class-name="film-actors">
        <detail-swiper-item v-for="(actor, index) in filmInfo.actors" :key="actor.name">
          <img class="avatar" :src="actor.avatarAddress"  @click="actorsPreview(index)"/>
          <div class="role">{{ actor.role }}</div>
          <div class="actor-name">{{ actor.name }}</div>
        </detail-swiper-item>
      </detail-swiper>
    </div>
    <div class="film-photos">
      <div class="film-photos-text">剧照
        <span class="more" @click="photosPreview(0)">更多<van-icon name="arrow"/></span>
      </div>
      <detail-swiper :per-view="1.5" :interval="16" class-name="film-photos">
        <!-- 实际上如果不删除变动v-for遍历的元素只读，那么使用index作为key的值也可以， -->
        <detail-swiper-item
          v-for="(photo, index) in filmInfo.photos"
          :key="index"
        >
          <div @click="photosPreview(index)"
            class="frame-photo"
            :style="{ backgroundImage: `url(${photo})` }"
          ></div>
        </detail-swiper-item>
      </detail-swiper>
    </div>
  </div>
</template>

<script>
// import axios from "axios";
import http from '@/util/http'
import isNavShow from '@/util/mixinShowNav'
import detailSwiper from '@/components/detail/DetailSwiper.vue'
import detailSwiperItem from '@/components/detail/DetailSwiperItem.vue'
import detailHeader from '@/components/detail/DetailHeader.vue'
import Vue from 'vue'
import moment from 'moment'
import { ImagePreview, Icon } from 'vant'

Vue.use(Icon)

// 通过指令实现header滑动一定距离隐藏显示由于指令不在data或methods，或者mounted等生命周期内部，this指向的是windows
// 所以此时不能直接操作data内部的数据，直接使用el操作style即可
Vue.directive('scroll', {
  inserted (el, binding) {
    // console.log(binding)
    onscroll = () => {
      console.log(document.documentElement.scrollTop) // 滑动后，向下滑动的距离，多过顶的距离
      // console.log(document.documentElement.scrollHeight)   //整个html的高度即可滑动的距离
      // console.log(document.documentElement.scrollLeft)      //滑动后，向右边滑动的距离，多过左边的距离
      // console.log(document.documentElement.scrollWidth)     //整个html的宽度，可滑动的距离
      if (document.documentElement.scrollTop <= binding.value) { el.style.visibility = 'hidden' } else { el.style.visibility = 'visible' }
    }
  },
  unbind () {
    onscroll = null
  }
})

export default {
  mixins: [isNavShow],
  components: {
    detailSwiper,
    detailSwiperItem,
    detailHeader
  },
  data () {
    // 空数组为真所以判断都是.length
    // 对象用null，可以使用v-if=该对象，判断是否加载
    return {
      filmInfo: null,
      isHidden: true,
      headerisHidden: true
    }
  },
  methods: {
    getPremiereTime (date) {
      return moment(date * 1000).format('YYYY-MM-DD')
    },
    photosPreview (index) {
      ImagePreview({
        images: this.filmInfo.photos,
        startPosition: index,
        closeable: true
      })
    },
    actorsPreview (index) {
      ImagePreview({
        images: this.filmInfo.actors.map(actor => actor.avatarAddress),
        startPosition: index,
        closeable: true
      })
    }
  },
  created () {
    // 动态路由---怎么拿到动态路由传过来的/:param呢
    // 可以使用bom的location.href/hash拿到全部的url解析字符串/:param, 但是很麻烦

    // 利用this.$route---可以拿到当前的路由的对象(path属性跟location.hash一样),
    // 但是里面有一个属性是params, 可以存放动态路由传递的属性，还有一个属性是fullpath代表全url(除域名含query)
    // 还有一个属性是query能够拿到get请求的参数， path属性能拿到去除query后的url，
    // matched能拿到匹配到的路由：是一个数组，可以查看是不是重定向或者重定向了几次，如果没有重定向，一定是一个长度为1的数组，长度大于1说明先匹配到某个路由再被重定向了
    // 跟nodejs 的 URL 对象的searchparams 的什么方法可以拿到, 具体说明忘了, 看看
    console.log(this.$route) // 这个$route  就是路由守卫的回调函数里的参数to
    console.log(this.$route.params.id)

    // 那么这个动态路由有什么用呢?
    // 比如我点击列表的某一列, 要跳转到详情的页面(全部刷新), 显示有关的信息, 对应的数据库两张表
    // 举个例子: 食品--->一张表放食品店里面存放的所有食品的种类, 另一张表则防每个食品对应的信息信息, 外键是视频的id
    // 那么利用动态路由传递id, 到达详情页面后, 通过this.$route.params拿到id, 此后立即向后端发送请求
    // 接口就是根据id拿到对应数据库的详细信息, 拿到后渲染页面即可
  },
  mounted () {
    // mixin可以混入生命周期和methods方法，不会覆盖组件内原有的生命周期和方法
    this.fqm()
    http({
      // 这个k是为了防止短时间内每次请求一样，浏览器未来优化性能会直接读本地缓存的网页，而不会再向后端发起一次请求
      // 为了获取实时最新的数据，就需要加上一个随机数，即k=...拼接在原请求后面，来取最新数据
      url: `/gateway?filmId=${this.$route.params.id}&k=2410887`,
      headers: {
        'X-Host': 'mall.film-ticket.film.info'
      }
    }).then((res) => {
      this.filmInfo = res.data.data.film
      //   console.log(this.filmInfo);
    })

    // 这个效果同样可以使用自定义指令来实现
    // 这里可以使用组件的生命周期mounted对onscroll监听设置自定义方法从而能够滑动一定距离隐藏显示
    // onscroll = () => {
    //     console.log(document.documentElement.scrollTop)
    //     // console.log(document.documentElement.scrollHeight)
    //     // console.log(document.documentElement.scrollLeft)
    //     // console.log(document.documentElement.scrollWidth)
    //     if (document.documentElement.scrollTop > 60)
    //       this.headerisHidden = false;
    //     else this.headerisHidden = true;
    //   }
  },
  destroyed () {
    // 切记对于windows  即bom的方法，就算组件销毁了，其也会存在，所以在组件销毁的时候要清空该方法，赋值为空即可
    // onscroll = null
    console.log('摧毁啦')
  }
}
</script>

<style lang="scss" scoped>
.header-name {
  display: inline-block;
  width: 100%;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.24);
  background-color: white;
  text-align: center;
  line-height: 2.8125rem;
  font-size: 1.25rem;
}
.hidden-header {
  visibility: hidden;
}
.background {
  background-color: rgb(238, 238, 238);
}
.poster {
  margin: 0;
  width: 100%;
  height: 13.125rem;
  background-position: center; //设置背景图像的位置
  background-size: cover; //设置背景图像的大小
}
.content {
  position: relative;
  font-size: 0.8125rem;
  color: rgb(124, 124, 124);
  padding: 0.9375rem;
  margin-bottom: 0.3125rem;
  background-color: white;
  box-shadow: 0 0.125rem 0.25rem rgba(104, 104, 104, 0.363);
  .name {
    color: black;
    font-size: 1.25rem;
    line-height: 1.5rem;
    margin-right: 0.25rem;
  }
  .item {
    display: inline-block;
    color: white;
    font-size: 0.75rem;
    background-color: rgb(180, 180, 180);
    border-radius: 0.125rem;
    padding: 0 0.25rem;
  }
  .grade {
    position: absolute;
    right: 1rem;
    display: inline-block;
    font-size: 1.125rem;
    font-style: italic;
    color: rgb(255, 94, 0);
    .grade-text {
      font-size: 1rem;
    }
  }
  .film-category {
    margin-top: 0.625rem;
    font-size: 0.875rem;
  }
  .film-premiere-time {
    margin: 0.125rem 0;
  }
  .film-nation-runtime {
    margin-bottom: 0.625rem;
  }
  .film-synopsis {
    font-size: 0.875rem;
    line-height: 1rem;
  }
}
.hidden {
  display: -webkit-box;

  -webkit-box-orient: vertical;
  line-clamp: 2;
  -webkit-line-clamp: 2;
  height: 2rem;
  overflow: hidden;
  text-overflow: ellipsis;
}
.show-synopsis {
  margin-top: 0.25rem;
  line-height: 1rem;
  text-align: center;
  svg {
    width: 1rem;
    height: 1rem;
    path {
      fill: rgb(124, 124, 124);
    }
  }
}
.actors {
  margin: 0.5rem 0;
  padding: 0.9375rem;
  background-color: rgb(255, 255, 255);
  color: rgb(82, 82, 82);
  text-align: center;
  box-shadow: 0 0.125rem 0.25rem rgba(104, 104, 104, 0.363);

  .actors-text {
    color: rgb(73, 73, 73);
    text-align: left;
    font-family: Microsoft Yahei, Arial, sans-serif;
    font-size: 1.125rem;
    margin-bottom: 0.75rem;
  }

  .avatar {
    width: 100%;
  }
  .role {
    font-size: 0.8125rem;
    margin: 0.125rem;
  }
  .actor-name {
    font-size: 0.875rem;
  }
}
.film-photos {
  padding: 0.9375rem;
  background-color: white;
  margin-bottom: 0.5rem;
  .film-photos-text {
    position: relative;
    font-size: 1.125rem;
    margin-bottom: 0.75rem;
    .more{
      display: inline-block;
      position: absolute;
      right: .625rem;
      font-size: .875rem;
      color: rgb(119, 119, 119);
    }
  }
  .film-photos {
    padding: 0;
    align-items: center;
  }
  .frame-photo {
    height: 7.5rem;
    background-size: cover;
    background-position: center;
  }
}
</style>
